﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using EControl.Modelo;
using EControl.Controle;

namespace EControl
{
	/// <summary>
	/// Interaction logic for ConfigWindow.xaml
	/// </summary>
	public partial class ConfigWindow : Window
	{
        public ConfigWindow()
		{
			this.InitializeComponent();
            resetTodos();
            grdFuncionarios.Visibility = System.Windows.Visibility.Visible;
		}

        private void resetTodos()
        {
            resetFuncionarios();
            resetVagas();
            resetPrecos();
        }

        #region geral
        
        private void Rectangle_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            DragMove();
        }

        private void lblTituloInterface_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            DragMove();
        }

        private void btnFechar_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        #endregion

        #region funcionarios

        string Pesquisa = "";

        private void btnFuncionarios_Checked(object sender, RoutedEventArgs e)
        {
            btnVagas.IsChecked = false;
            btnPreços.IsChecked = false;
            lblTituloInterface.Content = "Funcionarios";

            resetTodos();
            grdFuncionarios.Visibility = System.Windows.Visibility.Visible;

            Pesquisa = "";

            Usuario user = new Usuario();
            List<User> usuarios = user.pesquisar(Pesquisa);

            listFunc.Items.Clear();

            foreach (User usuario in usuarios)
            {
                listFunc.Items.Add(usuario);
            }
        }

        private void resetFuncionarios()
        {
            grdFuncionarios.Visibility = System.Windows.Visibility.Hidden;
            grdFuncionariosList.Visibility = System.Windows.Visibility.Visible;
            grdFuncionariosDetalhes.Visibility = System.Windows.Visibility.Hidden;
            grdFuncionariosEditar.Visibility = System.Windows.Visibility.Hidden;
            grdFuncionariosNovo.Visibility = System.Windows.Visibility.Hidden;
        }

        private void btnFuncPesquisar_Click(object sender, RoutedEventArgs e)
        {
            pesquisar();
        }

        private void pesquisar()
        {
            Pesquisa = txtFuncPesquisa.Text;

            Usuario user = new Usuario();
            List<User> usuarios = user.pesquisar(Pesquisa);

            listFunc.Items.Clear();

            foreach (User usuario in usuarios)
            {
                listFunc.Items.Add(usuario);
            }
        }

        private void btnFuncApagar_Click(object sender, RoutedEventArgs e)
        {
            User user = new User();
            user = null;

            if (listFunc.SelectedIndex > -1)
            {
                user = (User)listFunc.SelectedItems[0];
            }
            
            if (user == null)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Selecione um usuário para apagar.", "Erro", botao);
            }
            else
            {
                
                MessageBoxResult dialogResult = MessageBox.Show("Têm certeza que deseja apagar o usuário?", "Aviso", MessageBoxButton.YesNo);
                if (dialogResult == MessageBoxResult.Yes)
                {
                    Usuario usuario = new Usuario();
                    bool temp = usuario.apagarUsuario(user.Id);
                    if (temp)
                    {
                        MessageBox.Show("Usuário apagado com sucesso.", "Aviso", MessageBoxButton.OK);
                        pesquisar();
                    }
                    else
                    {
                        MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", MessageBoxButton.OK);
                    }
                }
            }
        }

        private void btnFuncDetalhes_Click(object sender, RoutedEventArgs e)
        {
            User usuario = new User();
            usuario = null;

            if (listFunc.SelectedIndex > -1)
            {
                usuario = (User)listFunc.SelectedItems[0];
            }

            if (usuario == null)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Selecione um usuário para exibir seus detalhes.", "Erro", botao);
            }
            else
            {
                Usuario user = new Usuario();
                usuario = user.detalhesUsuario(usuario.Id);

                if (usuario.IsAdmin == true)
                {
                    lblFuncDetTipo.Content = "Administrador";
                }
                else
                {
                    lblFuncDetTipo.Content = "Usuário comum";
                }

                lblFuncDetNome.Content = usuario.Nome;
                lblFuncDetCPF.Content = usuario.Cpf;
                lblFuncDetEmail.Content = usuario.Email;
                lblFuncDetUsuario.Content = usuario.Usuario;

                grdFuncionariosList.Visibility = System.Windows.Visibility.Hidden;
                grdFuncionariosDetalhes.Visibility = System.Windows.Visibility.Visible;
            }
        }

        private void btnFuncDetVoltar_Click(object sender, RoutedEventArgs e)
        {
            grdFuncionariosList.Visibility = System.Windows.Visibility.Visible;
            grdFuncionariosDetalhes.Visibility = System.Windows.Visibility.Hidden;
        }

        private void btnFuncNovo_Click(object sender, RoutedEventArgs e)
        {
            grdFuncionariosList.Visibility = System.Windows.Visibility.Hidden;
            grdFuncionariosNovo.Visibility = System.Windows.Visibility.Visible;

            // Limpa tudo
            txtFuncNovoRepSenha.Password = "";
            txtFuncNovoSenha.Password = "";
            txtFuncNovoUsuario.Text = "";
            txtFuncNovoEmail.Text = "";
            txtFuncNovoCPF.Text = "";
            txtFuncNovoNome.Text = "";
            chkFuncNovoAdmin.IsChecked = false;
        }

        private void btnFuncNovoVoltar_Click(object sender, RoutedEventArgs e)
        {
            grdFuncionariosList.Visibility = System.Windows.Visibility.Visible;
            grdFuncionariosNovo.Visibility = System.Windows.Visibility.Hidden;
        }

        private void btnFuncNovoCadastrar_Click(object sender, RoutedEventArgs e)
        {
            User user = new User();

            user.Nome = txtFuncNovoNome.Text;
            user.Email = txtFuncNovoEmail.Text;
            user.Cpf = txtFuncNovoCPF.Text;
            user.Usuario = txtFuncNovoUsuario.Text;
            user.Senha = txtFuncNovoSenha.Password;
            user.RepSenha = txtFuncNovoRepSenha.Password;
            user.IsAdmin = (bool)chkFuncNovoAdmin.IsChecked;

            if (validaNovoUsuario(user))
            {
                Usuario usuario = new Usuario();
                bool ok = usuario.novoUsuario(user);
                if (ok)
                {
                    MessageBox.Show("Usuário criado com sucesso!", "Aviso", MessageBoxButton.OK);
                    grdFuncionariosList.Visibility = System.Windows.Visibility.Visible;
                    grdFuncionariosNovo.Visibility = System.Windows.Visibility.Hidden;
                }
                else
                {
                    grdFuncionariosList.Visibility = System.Windows.Visibility.Visible;
                    grdFuncionariosNovo.Visibility = System.Windows.Visibility.Hidden;
                }
            }
        }

        private bool validaUsuarioEditar(User usuarioAntigo, User usuarioNovo)
        {
            Usuario user = new Usuario();

            if (usuarioAntigo.Nome != usuarioNovo.Nome)
            {
                if (usuarioNovo.Nome == "")
                {
                    MessageBox.Show("Por favor digite um nome", "Aviso", MessageBoxButton.OK);
                    txtFuncEditNome.Focus();
                    return false;
                }
            }

            if (usuarioAntigo.Cpf != usuarioNovo.Cpf)
            {
                if (usuarioNovo.Cpf == "")
                {
                    MessageBox.Show("Por favor digite um CPF", "Aviso", MessageBoxButton.OK);
                    txtFuncEditCPF.Focus();
                    return false;
                }
                else if (user.cpfExiste(usuarioNovo.Cpf))
                {
                    MessageBox.Show("CPF já existente, por favor digite outro.", "Aviso", MessageBoxButton.OK);
                    txtFuncEditCPF.Focus();
                    return false;
                }
            }

            if (usuarioAntigo.Usuario != usuarioNovo.Usuario){
                if (usuarioNovo.Usuario == "")
                {
                    MessageBox.Show("Por favor digite um usuário", "Aviso", MessageBoxButton.OK);
                    txtFuncNovoUsuario.Focus();
                    return false;
                }
                else if (user.usuarioExiste(usuarioNovo.Usuario))
                {
                    MessageBox.Show("Usuário já existente, por favor digite outro", "Aviso", MessageBoxButton.OK);
                    txtFuncEditUsuario.Focus();
                    return false;
                }
            }

            return true;
        }

        private bool validaNovoUsuario(User usuario)
        {
            Usuario user = new Usuario();
            if (usuario.Nome == "")
            {
                MessageBox.Show("Por favor digite um nome", "Aviso", MessageBoxButton.OK);
                txtFuncNovoNome.Focus();
                return false;
            }
            else if (usuario.Email == "")
            {
                MessageBox.Show("Por favor digite um email", "Aviso", MessageBoxButton.OK);
                txtFuncNovoEmail.Focus();
                return false;
            }
            else if (usuario.Cpf == "")
            {
                MessageBox.Show("Por favor digite um CPF", "Aviso", MessageBoxButton.OK);
                txtFuncNovoCPF.Focus();
                return false;
            }
            else if (user.cpfExiste(usuario.Cpf))
            {
                MessageBox.Show("CPF já existente, por favor digite outro.", "Aviso", MessageBoxButton.OK);
                txtFuncNovoUsuario.Focus();
                return false;
            }
            else if (usuario.Usuario == "")
            {
                MessageBox.Show("Por favor digite um usuário", "Aviso", MessageBoxButton.OK);
                txtFuncNovoUsuario.Focus();
                return false;
            }
            else if (user.usuarioExiste(usuario.Usuario))
            {
                MessageBox.Show("Usuário já existente, por favor digite outro.", "Aviso", MessageBoxButton.OK);
                txtFuncNovoUsuario.Focus();
                return false;
            }
            if (usuario.Senha == "")
            {
                MessageBox.Show("Por favor digite uma senha", "Aviso", MessageBoxButton.OK);
                txtFuncNovoSenha.Focus();
                return false;
            }
            else if (usuario.RepSenha == "")
            {
                MessageBox.Show("Por favor repita sua senha", "Aviso", MessageBoxButton.OK);
                txtFuncNovoRepSenha.Focus();
                return false;
            }
            else if (usuario.Senha != usuario.RepSenha)
            {
                MessageBox.Show("A senha e a confirmação de senha são diferentes", "Aviso", MessageBoxButton.OK);
                return false;
            }
            else
            {
                return true;
            }
        }

        private void grdFuncionariosList_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            pesquisar();
            txtFuncPesquisa.Text = Pesquisa;
        }

        private void btnFuncEditar_Click(object sender, RoutedEventArgs e)
        {
            User usuario = new User();
            usuario = null;

            if (listFunc.SelectedIndex > -1)
            {
                usuario = (User)listFunc.SelectedItems[0];
            }

            if (usuario == null)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Selecione um usuário para editar", "Erro", botao);
            }
            else
            {
                Usuario user = new Usuario();
                usuario = user.detalhesUsuario(usuario.Id);

                lblFuncEditId.Content = usuario.Id;
                txtFuncEditNome.Text = usuario.Nome;
                txtFuncEditEmail.Text = usuario.Email;
                txtFuncEditCPF.Text = usuario.Cpf;
                txtFuncEditUsuario.Text = usuario.Usuario;
                chkFuncEditAdmin.IsChecked = usuario.IsAdmin;

                grdFuncionariosList.Visibility = System.Windows.Visibility.Hidden;
                grdFuncionariosEditar.Visibility = System.Windows.Visibility.Visible;
            }
        }

        private void btnFuncEditVoltar_Click(object sender, RoutedEventArgs e)
        {
            grdFuncionariosList.Visibility = System.Windows.Visibility.Visible;
            grdFuncionariosEditar.Visibility = System.Windows.Visibility.Hidden;
        }

        private void btnFuncEditSalvar_Click(object sender, RoutedEventArgs e)
        {
            User user = new User();

            user.Id = lblFuncEditId.Content.ToString();
            user.Nome = txtFuncEditNome.Text;
            user.Email = txtFuncEditEmail.Text;
            user.Cpf = txtFuncEditCPF.Text;
            user.Usuario = txtFuncEditUsuario.Text;
            user.IsAdmin = (bool)chkFuncNovoAdmin.IsChecked;

            if (new Usuario().atualizaDetalhes(user))
            {
                MessageBox.Show("Usuário atualizado com sucesso", "Aviso", MessageBoxButton.OK);
            }

            grdFuncionariosList.Visibility = System.Windows.Visibility.Visible;
            grdFuncionariosEditar.Visibility = System.Windows.Visibility.Hidden;
        }

        private bool validaSenhaEdit(User usuario){

            if (usuario.RepSenha == "")
            {
                MessageBox.Show("Por favor repita sua senha", "Aviso", MessageBoxButton.OK);
                txtFuncNovoRepSenha.Focus();
                return false;
            }
            else if (usuario.Senha != usuario.RepSenha)
            {
                MessageBox.Show("A senha e a confirmação de senha são diferentes", "Aviso", MessageBoxButton.OK);
                return false;
            }
            else
            {
                return true;
            }
        }
        #endregion

        #region click dos botoes do menu

        private void btnFuncionarios_Click(object sender, RoutedEventArgs e)
        {
            btnFuncionarios.IsChecked = true;
        }
        
        private void btnVagas_Click(object sender, RoutedEventArgs e)
        {
            btnVagas.IsChecked = true;
        }

        private void btnPreços_Click(object sender, RoutedEventArgs e)
        {
            btnPreços.IsChecked = true;
        }
        #endregion

        #region vagas

        private void btnVagas_Checked(object sender, RoutedEventArgs e)
        {
            btnFuncionarios.IsChecked = false;
            btnPreços.IsChecked = false;
            lblTituloInterface.Content = "Vagas";
            resetTodos();
            grdVaga.Visibility = System.Windows.Visibility.Visible;
        }

        private void resetVagas()
        {
            grdVaga.Visibility = System.Windows.Visibility.Hidden;
        }

        private void grdVaga_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            listaTodos();
        }

        private void listaTodos()
        {
            VagaController vagaCon = new VagaController();
            List<VagaModel> vagas = new List<VagaModel>();

            vagas = vagaCon.pesquisarTodos();

            listVaga.Items.Clear();

            foreach (VagaModel vaga in vagas)
            {
                listVaga.Items.Add(vaga);
            }
        }

        private void btnVagaNovo_Click(object sender, RoutedEventArgs e)
        {
            VagaController vagaCon = new VagaController();
            vagaCon.criaVaga();
            listaTodos();
        }

        private void btnVagaDesativa_Click(object sender, RoutedEventArgs e)
        {
            VagaModel vaga = new VagaModel();
            vaga = null;

            if (listVaga.SelectedIndex > -1)
            {
                vaga = (VagaModel)listVaga.SelectedItems[0];
            }

            if (vaga == null)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Por favor selecione uma vaga", "Aviso", botao);
            }
            else
            {
                VagaController vagaCon = new VagaController();
                vagaCon.desativaVaga(vaga.Id);
                listaTodos();
            }
        }

        private void btnVagaAtiva_Click(object sender, RoutedEventArgs e)
        {
            VagaModel vaga = new VagaModel();
            vaga = null;

            if (listVaga.SelectedIndex > -1)
            {
                vaga = (VagaModel)listVaga.SelectedItems[0];
            }

            if (vaga == null)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Por favor selecione uma vaga", "Aviso", botao);
            }
            else
            {
                VagaController vagaCon = new VagaController();
                vagaCon.ativaVaga(vaga.Id);
                listaTodos();
            }
        }

        #endregion

        #region preços

        private void btnPreços_Checked(object sender, RoutedEventArgs e)
        {
            btnFuncionarios.IsChecked = false;
            btnVagas.IsChecked = false;
            lblTituloInterface.Content = "Preços";
            resetTodos();
            grdPreco.Visibility = System.Windows.Visibility.Visible;
        }

        private void resetPrecos()
        {
            grdPreco.Visibility = System.Windows.Visibility.Hidden;
        }

        private void grdPreco_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            PrecoController precoCon = new PrecoController();
            PrecoModel preco = new PrecoModel();

            preco = precoCon.pesquisaPreco();

            txtPrecoHora.Text = String.Format("{0:0.00}", decimal.Parse(preco.Hora));
            txtPrecoMensal.Text = String.Format("{0:0.00}", decimal.Parse(preco.Mensal));
        }

        private void btnPrecoSalvar_Click(object sender, RoutedEventArgs e)
        {
            PrecoController precoCon = new PrecoController();
            PrecoModel preco = new PrecoModel();

            preco.Hora = txtPrecoHora.Text.Replace(",", ".");
            preco.Mensal = txtPrecoMensal.Text.Replace(",", ".");
            
            precoCon.novoPreco(preco);
        }

        #endregion
    }
}